#include "comment.h"

char currentLoginUserName[128] = {0};

// 工作线程，接受服务器返回来的消息
void *work(void *pArg)
{
     // 把套接字从地址里面取出来
     int sID = *(int *)pArg;
     printf("接受数据的线程开始工作了\n");
     // 用户连接后会创建当前线程，并且会把用户的套接字id通过参数传入进来
     // 这里是把套接字从地址里面取出来
     MSG msg;
     struct sockaddr_in clientAddr;
     socklen_t len = sizeof(clientAddr);
     int ret = 0;
     //接收消息
     while (0 < (ret = recv(sID, &msg, sizeof(MSG), 0)))
     {
          SINGLE_CHAT *pSC = (SINGLE_CHAT *)msg.buf;
          printf("接受到%s发来的消息%s\n", pSC->selfName, pSC->text);
     }
     if (ret <= 0)
     {
          printf("接受数据出错了，服务器可能被关掉了\n");
     }
}

//查询聊天记录
int queryChatRecord(int sID)
{
     SINGLE_CHAT sc;
     strcpy(sc.selfName, currentLoginUserName); // 自己的名字
     printf("请输入对方的名字\n");
     scanf("%s", sc.destName);

     MSG msg;
     msg.type = queryChatRec;//消息类型为查询聊天记录
     memcpy(msg.buf,&sc,sizeof(SINGLE_CHAT));

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return -1;
     }

     msg.type = 100000;//先把消息类型清空
     ret = 0;
     //接受服务器返回的聊天记录，如果消息类型为queryOver，说明接受完毕
     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if(msg.type == queryOver)//查询结束
          {
               break;
          }
          else if(msg.type == queryChatRec)
          {
               SINGLE_CHAT *pSC = (SINGLE_CHAT *)msg.buf;
               printf("接受到聊天记录：%s %s %s\n", pSC->selfName, pSC->destName, pSC->text);               
          }

     }
     return 0;
}


int registerUser(int sID)
{
     RGU rgu;
     printf("请输入用户名和密码\n");
     scanf("%s%s", rgu.name, rgu.pwd);

     MSG msg;
     msg.type = regist;
     memcpy(msg.buf, &rgu, sizeof(rgu)); // 把注册结构体拷贝到消息结构体的仓库中

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return -1;
     }
}

int userLogin(int sID)
{
     RGU rgu; // 登录可以重用注册的结构体
     printf("请输入用户名和密码\n");
     scanf("%s%s", rgu.name, rgu.pwd);

     MSG msg;
     msg.type = login;
     memcpy(msg.buf, &rgu, sizeof(rgu)); // 把注册结构体拷贝到消息结构体的仓库中

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return -1;
     }

     // 接受服务器的回复
     struct sockaddr_in serverAddr;
     socklen_t len = sizeof(serverAddr);
     // clientAddr是对方的地址,len地址的长度
     ret = recv(sID, &msg, sizeof(msg), 0);
     if (msg.type == ok)
     {
          printf("我登陆成功了\n");
          strcpy(currentLoginUserName, rgu.name); // 把用户名保存到全局变量中，其他地方都可以使用
          // printf("1.聊天 2.加好友 3.发朋友圈 4.返回上级菜单")
          return 1;
     }
     else
     {
          printf("还没有注册或者用户名密码错误\n");
          return -1;
     }
}

void userSingleChat(int sID)
{
     pthread_t pt;
     MSG msg;
     // 启动一个接受消息的线程
     pthread_create(&pt, NULL, work, &sID);
     SINGLE_CHAT sc;
     strcpy(sc.selfName, currentLoginUserName); // 自己的名字
     printf("请输入对方的名字\n");
     scanf("%s", sc.destName);

     while (1)
     {
          printf("请输入聊天的内容\n");
          scanf("%s", sc.text);

          msg.type = singleChat; // 消息类型为单聊
          // 把单聊的内容拷贝到消息的仓库中
          memcpy(msg.buf, &sc, sizeof(sc));

          // 把消息发送给服务器
          int ret = send(sID, &msg, sizeof(msg), 0);
          if (ret == -1)
          {
               printf("发送数据出错了\n");
               break;
          }

          if (strcmp(sc.text, "quit") == 0)
          {
               pthread_cancel(pt);
               break;
          }
     }
}

int main(int count, char *arg[])
{
     struct sockaddr_in sin;
     sin.sin_family = AF_INET;//IPV4的网络地址版本
     sin.sin_port = htons(9000);//把9000号端口转为网络字节序并赋值给端口参数

     u_int32_t ip = 0;
     //把字符串ip地址转为网络字节序ip
     inet_pton(AF_INET, "192.168.74.129", &ip);
     sin.sin_addr.s_addr = ip;

     //创建一个tcp套接字，参数1指定地址族，参数2指定协议，SOCK_STREAM代表是TCP，SOCK_DGRAM代表UDP
     int sID = socket(AF_INET,SOCK_STREAM,0);

     while(-1 == connect(sID,(struct sockaddr*)&sin,sizeof(struct sockaddr_in)))
     {
          perror("连接服务器中...");
          sleep(1);
     }

     char buf[128];
     while (1)
     {
          printf("请选择你要的操作：1.登录 2.注册 3.聊天 4.查看聊天记录\n");
          scanf("%s", buf);
          if (strcmp(buf, "1") == 0)
          {
               userLogin(sID);
          }
          else if (strcmp(buf, "2") == 0) // 注册
          {
               if (-1 == registerUser(sID))
               {
                    printf("注册失败了\n");
               }
          }
          else if (strcmp(buf, "3") == 0) // 聊天
          {
               MSG msg;
               printf("请选择：1.群聊 2.私聊\n");
               char buf[16];
               scanf("%s", buf);
               if (strcmp(buf, "1") == 0)
               {
               }
               else if (strcmp(buf, "2") == 0) // 私聊
               {
                    userSingleChat(sID);
               }
          }
          else if(strcmp(buf, "4") == 0)//查看聊天记录
          {
               queryChatRecord(sID);
          }
     }

     close(sID);

     return 0;
}